// 函数：封装了一些常用的方法，在使用的时候直接调用

(() => {
  // 这是js的写法
  // // 函数声明与命名函数
  // function add(x, y) {
  //   return x + y
  // }

  // // 函数表达式
  // const sum = function (x, y) {
  //   return x + y
  // }

  // ts的写法

  function add(x: string, y: string): string {
    return x + y
  }

  console.log(add('111', '222'));


  const sum: (x: number, y: number) => number = function (x: number, y: number): number {
    return x + y
  }

  console.log(sum(11, 22));

  // 可选参数和默认参数
  // 默认参数：函数在声明的时候，参数有自己的默认值
  // 可选参数：函数在声明的时候，参数带?进行修饰


  const fullName = function (firstName: string = '东方', lastNmae?: string): string {
    if (lastNmae) {
      return lastNmae + firstName
    } else {
      return firstName
    }
  }

  console.log(fullName('dandan', 'liu'))



  // 剩余参数：rest

  function showMsg(str: string, ...args: string[]) {
    console.log(str)
    console.log(args)
  }

  showMsg('1', '2', '3', '5')

  // 函数重载
  // 函数重载，要么全部是string,要么全部是number
  function addString(x: string, y: string): string
  function addString(x: number, y: number): number


  function addString(x: string | number, y: string | number): string | number {
    // return x + y
    if (typeof x === 'string' && typeof y === 'string') {
      return x + y
    } else if (typeof x === 'number' && typeof y === 'number') {
      return x + y
    }
  }

  addString(1, 2)
  addString('1', '2')
  // addString(1, '2')
  // addString('2',1)


})()